﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace FrontEndPlus.Módulos.RRHH
{
    public partial class wbfrm_Planillas : System.Web.UI.Page
    {
        #region Variables

        private WCF_Gimnasio.cls_Planilla _planilla = new WCF_Gimnasio.cls_Planilla();
        private WCF_Gimnasio.cls_Empleado _empleado = new WCF_Gimnasio.cls_Empleado();

        private ds_datos_planilla _datosPlanilla = new ds_datos_planilla();

        #endregion

        #region Metodos

        private void AsignarAusencias()
        {
            int rowIndex = 0;

            DataTable planillaEnTramite = (DataTable)ViewState["PlanillaEnTramite"];

            foreach (DataRow dr in planillaEnTramite.Rows)
            {
                var idEmpleado = Convert.ToInt32(dr[0].ToString());
                var totalHorasLaboradas = Convert.ToInt32(TotalHorasLaboradas(idEmpleado));

                Label lbl_ausencias = gv_planilla_En_Tramite.Rows[rowIndex].FindControl("lbl_ausencias") as Label;

                if (lbl_ausencias != null)
                {
                    int marcas = totalHorasLaboradas / 192;
                    int marcasRealizadas = marcas - 192;

                    lbl_ausencias.Text = ((marcasRealizadas > 0) ? marcasRealizadas.ToString() : "0,00");
                }

                rowIndex++;
            }
        }

        private void AsignarCuotaCredito()
        {
            int rowIndex = 0;

            DataTable planillaEnTramite = (DataTable)ViewState["PlanillaEnTramite"];

            foreach (DataRow dr in planillaEnTramite.Rows)
            {
                var idEmpleado = Convert.ToInt32(dr[0].ToString());
                var cuotaCredito = CoutaCredito(idEmpleado);

                Label lbl_couta_Credito = gv_planilla_En_Tramite.Rows[rowIndex].FindControl("lbl_couta_Credito") as Label;

                if (lbl_couta_Credito != null)
                {
                    lbl_couta_Credito.Text = ((cuotaCredito > 0) ? cuotaCredito.ToString() : "0,00");
                }

                rowIndex++;
            }
        }

        private void AsignarHorasExtras()
        {
            int rowIndex = 0;

            DataTable planillaEnTramite = (DataTable)ViewState["PlanillaEnTramite"];

            foreach (DataRow dr in planillaEnTramite.Rows)
            {
                var idEmpleado = Convert.ToInt32(dr[0].ToString());
                var horaExtra = Convert.ToDecimal(dr[10].ToString());
                var totalHorasLaboradas = Convert.ToInt32(TotalHorasLaboradas(idEmpleado));

                Label lbl_hra_Extra = gv_planilla_En_Tramite.Rows[rowIndex].FindControl("lbl_hra_Extra") as Label;

                if (lbl_hra_Extra != null)
                {
                    decimal resultado = 0;
                    if (totalHorasLaboradas > 240)
                    {
                        resultado = (totalHorasLaboradas - 250) * horaExtra;
                    }

                    lbl_hra_Extra.Text = ((resultado > 0) ? resultado.ToString() : "0,00");
                }

                rowIndex++;
            }
        }

        private void CargarPlanillaEnTramite()
        {
            gv_planilla_En_Tramite.DataSource = (DataTable)ViewState["PlanillaEnTramite"];
            gv_planilla_En_Tramite.DataBind();
        }

        private void CargarPlanilla()
        {
            gv_planilla.DataSource = _datosPlanilla;
            gv_planilla.DataBind();
        }

        private decimal CoutaCredito(int idEmpleado)
        {
            WCF_Gimnasio.cls_Credito credito = new WCF_Gimnasio.cls_Credito();
            credito.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
            credito.IdEmpleado = idEmpleado;

            object coutaTotalPagar = 0;
            using (WCF_Gimnasio.ServiceClient servicio = new WCF_Gimnasio.ServiceClient())
            {
                coutaTotalPagar = servicio.Listar(2, credito).Tables[0].Rows[0][0];
            }

            return ((coutaTotalPagar == Convert.DBNull) ? 0 : Convert.ToDecimal(coutaTotalPagar));
        }

        private void CrearPlanillaEnTramite()
        {
            _empleado.Filtros[0] = "3";
            _empleado.IdDepartamento = Convert.ToInt32(dplt_departamento.SelectedValue);

            using (WCF_Gimnasio.ServiceClient servicio = new WCF_Gimnasio.ServiceClient())
            {
                ViewState["PlanillaEnTramite"] = servicio.Listar(3, _empleado).Tables[0];
            }
        }

        private void CrearPlanilla()
        {
            VerficarDatosPlanilla();

            try
            {
                int rowIndex = 0;
                foreach (GridViewRow gvr in gv_planilla_En_Tramite.Rows)
                {
                    CheckBox chkbx_estado = gv_planilla_En_Tramite.Rows[rowIndex].FindControl("chkbx_estado") as CheckBox;

                    if (chkbx_estado.Checked)
                    {
                        DataRow dr = _datosPlanilla.Tables[0].NewRow();

                        dr[0] = gvr.Cells[0].Text;
                        dr[1] = gvr.Cells[1].Text;
                        dr[2] = gvr.Cells[2].Text;
                        dr[3] = gvr.Cells[3].Text;
                        dr[4] = gvr.Cells[4].Text;
                        dr[6] = gvr.Cells[6].Text;
                        dr[7] = gvr.Cells[7].Text;
                        dr[8] = gvr.Cells[8].Text;
                        dr[9] = gvr.Cells[9].Text;

                        _datosPlanilla.Tables[0].Rows.Add(dr);
                    }

                    rowIndex++;
                }
            }

            catch (Exception)
            {
                return;
            }
        }

        private void ModoPago(int rowIndex)
        {
            DataTable planillaEnTramite = (DataTable)ViewState["PlanillaEnTramite"];

            if (Convert.ToBoolean(planillaEnTramite.Rows[rowIndex][12]))
            {
                txt_periodo_Inicio.Text = DateTime.Now.ToShortDateString();
                txt_periodo_Final.Text = DateTime.Now.AddMonths(1).AddDays(1).ToShortDateString();
            }

            else
            {
                _planilla.Filtros[0] = DateTime.Today.ToShortDateString();

                object resultado = DateTime.Now;
                using (WCF_Gimnasio.ServiceClient servicio = new WCF_Gimnasio.ServiceClient())
                {
                    servicio.OtrosProcesos(2, ref resultado, _planilla);
                }

                txt_periodo_Inicio.Text = Convert.ToDateTime(resultado).Date.ToShortDateString();
                txt_periodo_Final.Text = Convert.ToDateTime(resultado).AddDays(16).ToShortDateString();
            }
        }

        private int NumeroPlanilla()
        {
            object resultado = 0;
            using (WCF_Gimnasio.ServiceClient servicio = new WCF_Gimnasio.ServiceClient())
            {
                servicio.OtrosProcesos(1, ref resultado, _planilla);
            }

            return Convert.ToInt32(resultado);
        }

        private void TotalAspectoPlanilla()
        {
            foreach (GridViewRow gvr in gv_planilla.Rows)
            {
                _planilla.TotalAusencias += Convert.ToDecimal(gvr.Cells[5].Text);
                _planilla.TotalDiasDobles += Convert.ToDecimal(gvr.Cells[6].Text);
                _planilla.TotalHorasExtras += Convert.ToDecimal(gvr.Cells[7].Text);
                _planilla.TotalIncapacidad += Convert.ToDecimal(gvr.Cells[8].Text);
            }
        }

        private object TotalHorasLaboradas(int idEmpleado)
        {
            _empleado.IdEmpleado = idEmpleado;
            _empleado.Filtros[0] = DateTime.Now.ToShortDateString();

            object resultado = 0;
            using (WCF_Gimnasio.ServiceClient servicio = new WCF_Gimnasio.ServiceClient())
            {
                servicio.OtrosProcesos(1, ref resultado, _empleado);
            }

            return resultado;
        }

        private decimal TotalPlanillaEnTramite()
        {
            decimal resultado = 0;

            for (int x = 0; x < gv_planilla_En_Tramite.Rows.Count; x++)
            {
                Label lbl_subtotal = gv_planilla_En_Tramite.Rows[x].FindControl("lbl_subtotal") as Label;
                if (lbl_subtotal != null)
                {
                    resultado += Convert.ToDecimal(lbl_subtotal.Text);
                }
            }

            return resultado;
        }

        private decimal TotalPlanilla()
        {
            int rowIndex = 0;
            decimal resultado = 0;

            foreach (GridViewRow gvr in gv_planilla.Rows)
            {
                if (!string.IsNullOrEmpty(gvr.Cells[11].Text) && !string.IsNullOrWhiteSpace(gvr.Cells[10].Text))
                {
                    resultado += Convert.ToDecimal(gvr.Cells[9].Text);
                }

                rowIndex++;
            }

            return resultado;
        }

        private void SubtotalPlanilla(int rowIndex)
        {
            Label lbl_salario_Base = gv_planilla_En_Tramite.Rows[rowIndex].FindControl("lbl_salario_Base") as Label;
            Label lbl_subtotal = gv_planilla_En_Tramite.Rows[rowIndex].FindControl("lbl_subtotal") as Label;

            VerificarCamposPlanilla(rowIndex);

            DataTable planillaEnTramite = (DataTable)ViewState["PlanillaEnTramite"];

            var salarioDiario = Convert.ToDecimal(planillaEnTramite.Rows[rowIndex][9].ToString()) * 8;
            var salarioMensual = Convert.ToDecimal(lbl_salario_Base.Text);

            var horasExtras = Convert.ToDecimal(planillaEnTramite.Rows[rowIndex][10].ToString()) * Convert.ToDecimal(gv_planilla_En_Tramite.Rows[rowIndex].Cells[5].Text);
            var ausencias = Convert.ToDecimal(gv_planilla_En_Tramite.Rows[rowIndex].Cells[6].Text) * salarioDiario;
            var diaDobles = Convert.ToDecimal(gv_planilla_En_Tramite.Rows[rowIndex].Cells[7].Text) * salarioDiario;
            var credito = Convert.ToDecimal(gv_planilla_En_Tramite.Rows[rowIndex].Cells[8].Text);
            var incapacidades = Convert.ToDecimal(gv_planilla_En_Tramite.Rows[rowIndex].Cells[9].Text) * salarioDiario;

            decimal totalGanacia = horasExtras + diaDobles;
            decimal totalDiferencia = ausencias + incapacidades + credito;

            lbl_subtotal.Text = ((salarioMensual - totalDiferencia) + totalGanacia).ToString();
        }

        private bool VerificarDepartamento()
        {
            WCF_Gimnasio.cls_Departamento departamento = new WCF_Gimnasio.cls_Departamento();
            departamento.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
            departamento.Filtros = new string[2];

            departamento.Filtros[0] = ((!string.IsNullOrEmpty(txt_periodo_Inicio.Text)) ? Convert.ToDateTime(txt_periodo_Inicio.Text).ToShortDateString() : DateTime.Now.ToShortDateString());
            departamento.Filtros[1] = ((!string.IsNullOrEmpty(txt_periodo_Final.Text)) ? Convert.ToDateTime(txt_periodo_Final.Text).ToShortDateString() : DateTime.Now.ToShortDateString());

            object resultado = 0;
            using (WCF_Gimnasio.ServiceClient servicio = new WCF_Gimnasio.ServiceClient())
            {
                servicio.OtrosProcesos(1, ref resultado, departamento);
            }

            return ((Convert.ToInt32(resultado) == 0) ? true : false);
        }

        private void VerificarCamposPlanilla(int rowIndex)
        {
            if (gv_planilla_En_Tramite.Rows[rowIndex].Cells[5].Text == "")
            {
                gv_planilla_En_Tramite.Rows[rowIndex].Cells[5].Text = "0,00";
            }

            if (gv_planilla_En_Tramite.Rows[rowIndex].Cells[6].Text == "")
            {
                gv_planilla_En_Tramite.Rows[rowIndex].Cells[6].Text = "0,00";
            }

            if (gv_planilla_En_Tramite.Rows[rowIndex].Cells[7].Text == "")
            {
                gv_planilla_En_Tramite.Rows[rowIndex].Cells[7].Text = "0,00"; ;
            }

            if (gv_planilla_En_Tramite.Rows[rowIndex].Cells[8].Text == "")
            {
                gv_planilla_En_Tramite.Rows[rowIndex].Cells[8].Text = "0,00";;
            }

            if (gv_planilla_En_Tramite.Rows[rowIndex].Cells[9].Text == "")
            {
                 gv_planilla_En_Tramite.Rows[rowIndex].Cells[9].Text = "0,00";
            }

            if (gv_planilla_En_Tramite.Rows[rowIndex].Cells[10].Text == "")
            {
                gv_planilla_En_Tramite.Rows[rowIndex].Cells[10].Text = "0,00";
            }
        }

        private void VerficarDatosPlanilla()
        {
            _datosPlanilla.Tables[0].Clear();

            if (_datosPlanilla.Tables[0].Rows.Count != 0)
            {
                _datosPlanilla.Tables[0].Rows.Clear();
            }
        }

        #endregion

        #region Eventos

        protected void Page_Load(object sender, EventArgs e)
        {
            _planilla.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
            _planilla.Filtros = new string[2];

            _empleado.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
            _empleado.Filtros = new string[2];

            lbl_numero_planilla.Text = NumeroPlanilla().ToString();

            if (!IsPostBack)
            {
                WCF_Gimnasio.cls_Departamento departamento = new WCF_Gimnasio.cls_Departamento();
                departamento.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());

                using (WCF_Gimnasio.ServiceClient servicio = new WCF_Gimnasio.ServiceClient())
                {
                    DataTable dt = servicio.Listar(3, departamento).Tables[0];

                    DataRow dr = dt.NewRow();
                    dr[0] = "-1";
                    dr[1] = "SELECCIONE UN DEPARTAMENTO";

                    dt.Rows.InsertAt(dr, 0);

                    dplt_departamento.DataSource = dt;
                    dplt_departamento.DataValueField = "ID_DEPARTAMENTO";
                    dplt_departamento.DataTextField = "NOMBRE_DEPARTAMENTO";
                    dplt_departamento.DataBind();
                }

                bool respuesta = VerificarDepartamento();
            }
        }

        protected void dplt_departamento_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (dplt_departamento.SelectedItem.Value != "-1")
            {
                CrearPlanillaEnTramite();
                CargarPlanillaEnTramite();

                AsignarAusencias();
                AsignarHorasExtras();
                AsignarCuotaCredito();

                lbl_total_En_Tramite.Text = TotalPlanillaEnTramite().ToString();
                lbl_total_Planilla.Text = TotalPlanilla().ToString();
            }
        }

        protected void rdobtnlt_opciones_Planilla_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch (rdobtnlt_opciones_Planilla.SelectedItem.Value)
            {
                case "1":
                    mtvw_opciones_Planilla.SetActiveView(vw_planilla_En_Tramite);
                    break;

                case "2":
                    mtvw_opciones_Planilla.SetActiveView(vw_planilla);
                    break;

                default:
                    break;
            }
        }

        protected void gv_planilla_En_Tramite_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gv_planilla_En_Tramite.PageIndex = e.NewPageIndex;

            CargarPlanillaEnTramite();
        }

        protected void gv_planilla_En_Tramite_RowEditing(object sender, GridViewEditEventArgs e)
        {
            TextBox txt_incapacidades = gv_planilla_En_Tramite.Rows[e.NewEditIndex].FindControl("txt_incapacidades") as TextBox;
            TextBox txt_diasDobles = gv_planilla_En_Tramite.Rows[e.NewEditIndex].FindControl("txt_dia_Dobles") as TextBox;

            if (txt_incapacidades != null && txt_diasDobles != null)
            {
                txt_incapacidades.Text = gv_planilla_En_Tramite.Rows[e.NewEditIndex].Cells[7].Text;
                txt_diasDobles.Text = gv_planilla_En_Tramite.Rows[e.NewEditIndex].Cells[8].Text;
            }

            gv_planilla_En_Tramite.EditIndex = e.NewEditIndex;
        }

        protected void gv_planilla_En_Tramite_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            TextBox txt_incapacidades = gv_planilla_En_Tramite.Rows[e.RowIndex].FindControl("txt_incapacidades") as TextBox;
            TextBox txt_diasDobles = gv_planilla_En_Tramite.Rows[e.RowIndex].FindControl("txt_dia_Dobles") as TextBox;

            gv_planilla_En_Tramite.Rows[e.RowIndex].Cells[7].Text = txt_incapacidades.Text;
            gv_planilla_En_Tramite.Rows[e.RowIndex].Cells[8].Text = txt_diasDobles.Text;

            ModoPago(e.RowIndex);
            SubtotalPlanilla(e.RowIndex);

            CrearPlanilla();
            CargarPlanilla();

            lbl_total_En_Tramite.Text = TotalPlanillaEnTramite().ToString();
            lbl_total_Planilla.Text = TotalPlanilla().ToString();

            gv_planilla_En_Tramite.EditIndex = -1;
        }

        protected void gv_planilla_En_Tramite_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            gv_planilla_En_Tramite.EditIndex = -1; ;
        }

        protected void gv_planilla_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gv_planilla.PageIndex = e.NewPageIndex;
        }

        protected void btn_aprobacion_Planilla_Click(object sender, EventArgs e)
        {
            if (gv_planilla.Rows.Count != 0)
            {
                using (WCF_Gimnasio.ServiceClient servicio = new WCF_Gimnasio.ServiceClient())
                {
                    string mensajeError = string.Empty;
                    int rowIndex = 0;

                    TotalAspectoPlanilla();

                    _planilla.InicioPeriodo = Convert.ToDateTime(txt_periodo_Inicio.Text);
                    _planilla.FinalPeriodo = Convert.ToDateTime(txt_periodo_Final.Text);
                    _planilla.Nota = txt_nota.Text;
                    _planilla.TotalPlanilla = Convert.ToDecimal(lbl_total_Planilla.Text);

                    servicio.InsertarActualizarRegistro(true, ref mensajeError, _planilla);

                    DataTable planillaEnTramite = (DataTable)ViewState["PlanillaEnTramite"];

                    if (!string.IsNullOrEmpty(mensajeError) && !string.IsNullOrWhiteSpace(mensajeError))
                    {
                        foreach (DataRow dr in planillaEnTramite.Rows)
                        {
                            WCF_Gimnasio.cls_Detalle_Planilla detallePlanilla = new WCF_Gimnasio.cls_Detalle_Planilla();
                            detallePlanilla.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());

                            detallePlanilla.IdPlanilla = Convert.ToInt32(lbl_numero_planilla.Text);

                            detallePlanilla.Empleado.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
                            detallePlanilla.Empleado.IdEmpleado = Convert.ToInt32(dr[0].ToString());
                            detallePlanilla.Empleado.Cedula = dr[1].ToString();
                            detallePlanilla.Empleado.Nombre = dr[2].ToString();
                            detallePlanilla.Empleado.Apellido = dr[3].ToString();
                            detallePlanilla.Empleado.Correo = dr[4].ToString();

                            var porcentajeAumento = Convert.ToDecimal(dr[6].ToString());
                            var salarioMensual = Convert.ToDecimal(dr[8].ToString());
                            var salarioDiario = Convert.ToDecimal(dr[9].ToString()) * 8;

                            var montoPorcentajeAumento = salarioMensual * porcentajeAumento;
                            salarioMensual = salarioMensual + montoPorcentajeAumento;

                            detallePlanilla.CantidadHorasExtras = Convert.ToInt32(gv_planilla.Rows[rowIndex].Cells[4].Text);
                            detallePlanilla.MontoHorasExtras = detallePlanilla.CantidadHorasExtras * Convert.ToDecimal(dr[10].ToString());

                            detallePlanilla.CantidadDiasAusencias = Convert.ToInt32(gv_planilla.Rows[rowIndex].Cells[5].Text);
                            detallePlanilla.MontoDiasAusencias = detallePlanilla.CantidadDiasAusencias * salarioDiario;

                            detallePlanilla.CantidadDiasDobles = Convert.ToInt32(gv_planilla.Rows[rowIndex].Cells[6].Text);
                            detallePlanilla.MontoDiasDobles = detallePlanilla.CantidadDiasDobles * salarioDiario;

                            detallePlanilla.CantidadDiasIncapacidad = Convert.ToInt32(gv_planilla.Rows[rowIndex].Cells[7].Text);
                            detallePlanilla.MontoDiasIncapacidad = detallePlanilla.CantidadDiasIncapacidad * salarioDiario;

                            detallePlanilla.PorcentajeCargasSociales = Convert.ToDecimal(dr[11].ToString());

                            var temporal = salarioMensual * detallePlanilla.PorcentajeCargasSociales;
                            detallePlanilla.MontoCargasSociales = salarioMensual - temporal;

                            detallePlanilla.SalarioBruto = salarioMensual;
                            detallePlanilla.SalarioNeto = Convert.ToDecimal(gv_planilla.Rows[rowIndex].Cells[9].Text);

                            servicio.InsertarActualizarRegistro(true, ref mensajeError, detallePlanilla);

                            object resultado = string.Empty;

                            servicio.OtrosProcesos(1, ref resultado, detallePlanilla);

                            _empleado = detallePlanilla.Empleado;

                            servicio.OtrosProcesos(2, ref resultado, _empleado);

                            rowIndex++;
                        }
                    }
                }
            }
        }

        #endregion

    }
}